package Thread;

import java.util.concurrent.Semaphore;

/**
 * Semaphore 信号量:
 *     主要用于两个目的：多个共享资源的互斥使用，另一给用于并发线程的控制
 *     成为信号灯，在多线程环境下，协调各个线程，以保证他们能够正确、合理的使用资源
 *
 *     acquire:线程通过acquire来获取到某个许可，然后对共享资源进行操作。如果许可已经分配完了，那么线程就进入阻塞状态，直到其他线程释放许可才有机会再次拿到许可
 */
public class Semaphore_Study {

    public static void main(String[] args) {
        Semaphore  semaphore = new Semaphore(3);

        for (int i = 1; i < 10; i++) {
            final int key=i;
            new Thread(()->{
              try{
                  try {
                      semaphore.acquire();//获取车位
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  System.out.println(Thread.currentThread().getName()+"\t抢到车位,\t目前车位还剩"+semaphore.getQueueLength());
                  try {
                      Thread.sleep(3000);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  System.out.println(Thread.currentThread().getName()+"\t停车5s中离开车位");
              }finally {
                  semaphore.release();//释放车位
              }
            },"线程"+key).start();
        }
    }
}
